/**
 * 功能：类绑定
 * 作者：王集鹄(zswang)
 * 日期：2010年11月29日
 * http://www.renrousousuo.com
 * 修改日志
 * 2010年12月4日 添加 多继承的功能，bindFrom()查询绑定关系的方法
 */
var ClassHelper = {
	/**
	 * 绑定
	 * @param {Function|Array} parent 父类构造器
	 * @param {Function} child 子类构造器
	 */
	bind: function (parent, child) {
		if (parent instanceof Array) { // 兼容一次绑定多个父类
			for (var i = 0; i < parent.length; i++) {
				arguments.callee.call(this, parent[i], child);
			}
			return;
		}
		if (!(parent instanceof Function && child instanceof Function) || 
			this.bindFrom(parent, child) || // 不能重复继承 
			this.bindFrom(child, parent) // 不能嵌套继承
		) return;
		// console.log(parent, child);
		var __child = child.prototype,
			__parent = parent.prototype,
			p, m;

		__child.__parents = __child.__parents || []; // 确保存在 
		__child.__parents.push(__parent); // 添加父原型链
		__child.base = this.__base; // 指定父方法

		for (p in __child) { // 寻找方法的上级方法
			m = __child[p];
			if (m instanceof Function && m != "base") {
				this.__scanParent(__parent, function (item) {
					if (item[p]) {
						m.__parentMethod = item[p];
						return true;
					}
				}, true);
			}
		}

		this.__scanParent(__parent, function (item) { // 克隆原型链属性
			for (p in item) {
				if (!(/^_/.test(p) || p in __child)) { // 不扫描克隆私有属性和覆盖
					__child[p] = item[p];
				}
			}
		}, true);
	},
	/**
	 * 扫描父类原型链
	 * @param {Object} __child 原型链
	 * @param {Function} scaner 扫描函数 function(item) {} item 为当前扫描的原型链
	 * @param {Boolean} start 是否扫描自己
	 */
	__scanParent: function (__child, scaner, start) {
		if (!(__child && scaner instanceof Function)) return;
		if (start && scaner(__child)) return true;
		var __parents = __child.__parents,
			i;
		if (!__parents) return;
		for (i = 0; i < __parents.length; i++) {
			if (scaner(__parents[i]) || arguments.callee.call(this, __parents[i], scaner)) return true;
		}
	},
	/**
	 * 查询绑定关系
	 * @param {Function} parent 父类构造函数
	 * @param {Function} child 子类构造函数
	 */
	bindFrom: function (parent, child) {
		if (!(parent instanceof Function && child instanceof Function)) return;
		return this.__scanParent(child.prototype, function (item) {
			return parent.prototype == item;
		});
	},
	/**
	 * 运行上级方法
	 */
	__base: function () {
		var m = arguments.callee.caller; // 获得调用者
		if (!m.__parentMethod) return;
		return m.__parentMethod.apply(this, arguments)
	}
};